package com.dong.Tools;

import com.dong.service.UserService;
import com.dong.servlet.UserFilter;
import com.dong.servlet.UserListener;
import com.dong.servlet.UserServlet;

import javax.servlet.*;
import javax.servlet.annotation.HandlesTypes;
import java.util.EnumSet;
import java.util.Set;

/**
 * 容器启动的时候, 会将 {@link HandlesTypes}指定的这个类型下面的子类(子类/接口)传递过来
 * 感兴趣的类型:
 */
@HandlesTypes(value = {UserService.class})
public class MyServeltContainerInitializer implements ServletContainerInitializer {
    /**
     * 应用启动时,会运行 下面的方法
     *
     * 使用 ServletContext 注册web组件(Servlet,Filter,Listener)
     *   2. 使用编码方式,在项目启动时候给ServletContext添加组件
     *              必须在项目启动时才能添加
     *              1). ServletContainerInitializer得到的ServletContext
     *              2). ServletContextListener, 在contextInitialized  , 所有组件基本都只能在初始化时候添加, 为了安全
     *
     *
     * @param set   所有感兴趣的类型, 就是上面注解的子类
     * @param servletContext
     * @throws ServletException
     */
    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        System.out.println("感兴趣的类型: ");
        for (Class<?> aClass : set) {
            System.out.println(aClass);
        }
        //注册组件
        ServletRegistration.Dynamic servlet = servletContext.addServlet("userServlet", new UserServlet());
        //配置servlet映射信息
        servlet.addMapping("/user");

        //listener
        servletContext.addListener(UserListener.class);

        //filter
        FilterRegistration.Dynamic userFilter = servletContext.addFilter("userFilter",UserFilter.class);
        userFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,"/*");

    }
}
